class Game {
	constructor(bg_music){ // 类似python里面的__init__方法
		// 构造函数
		this.rem();
		this.init_config();
		this.init();
		this.play_music(bg_music);
	}
	init_config(){
		// 项目配置
		this.config = {
			API_SERVER: "http://192.168.241.130:5000/api", // http服务端的网关接口地址
			SMS_TIME_OUT: 60,  // 短信发送的冷却时间
			APP_ID: "2044977606",  // 防水墙验证码的应用ID
		}
	}
	init(){
		try {
			if(axios){
				// axios初始化
			  axios.defaults.baseURL = this.config.API_SERVER; // 接口网关地址
			  axios.defaults.timeout = 2500; // 请求超时
			  axios.defaults.withCredentials = false; // 跨域请求时禁止携带cookie

			  // 添加请求拦截器
			  axios.interceptors.request.use((config)=>{
				    // 在发送请求之前的初始化[添加请求头],config就是本次请求数据对象
				    api.showProgress({ // loading动画
				        text: '网络请求中...',
				    		animationType:"zoom", // 动画效果
				        modal: true
				    });
				    return config;
				  }, (error)=>{
				    api.hideProgress(); // 关闭loading动画
				    // 对请求错误做些什么
						this.tips("网络错误！",3000);
				    return Promise.reject(error);
				});

			  // 添加响应拦截器
			  axios.interceptors.response.use((response)=>{
				    api.hideProgress(); // 关闭loading动画
				    // 判断接口返回状态码
				    if(response.data && response.data.error){
				      // 服务端报错
				      let error = response.data.error;
				      switch (error.code) {
				        case -32601:
				          // 请求接口不存在
									this.tips("请求的接口地址不存在！",3000);
				          break;
				        case 500:
				            // 请求接口不存在
										this.tips("程序执行错误\n"+error.message,3000);
				            break;
				      }
				    }

				    if(response.data && response.data.result){

				      // 请求唯一标记
				      if(axios.uuid != response.data.id){
								this.tips('请求拦截错误！',3000);
				        return false; // 阻止代码继续执行
				      }

				      // 业务报错
				      let result = response.data.result;
							if(result.errno == 1010){
								this.tips(result.errmsg,3000);
								this.openFrame("login","login.html"); // 暂时代码
								return false;
							}
				      if(result.errno != 1000){
								this.tips(result.errmsg,3000);
				      }
				    }
				    return response;
				  }, (error)=>{
				    // 网络错误提示
				    switch (error.message) {
				      case "Network Error":
				        this.tips("网络错误！",3000);
				        break;
				    }

			    	return Promise.reject(error);
			  });
			}

			if(Vue){
			  Vue.prototype.axios = axios;
			  Vue.prototype.uuid  = UUID.generate;
			}
		} catch (e) {
			console.log(e);
		}
	}
	post(vm,data={
		method: "",
		params: {},
		haeder: {},
		success:()=>{},
		fail:()=>{}
	}){
		// 基于axios发送post请求
		vm.axios.uuid = vm.uuid();
		vm.axios.post("",{
			"jsonrpc": "2.0",
			"id": vm.axios.uuid,
			"method": data.method,
			"params": data.params
		},data.haeder).then(data.success).catch(data.fail);
	}
	print(data,show){
		// 打印数据
		let content = JSON.stringify(data);
		if(show){
			alert(content);
		}else{
			console.log(content);
		}

	}
	tips(msg,duration=2500,location="top"){
		api.toast({
		    msg: msg,
		    duration: duration,
		    location: location
		});

	}
	back(prev){
		// 返回上一页
		this.go(prev.name,prev.url,{...prev});
	}
	go(name,url,pageParam){
		this.print(name)
		this.print(url)
		this.print(pageParam)
		// 跳转到指定页面
		api.openFrame({
				name: name,
				url: url,
				rect: {
						x: 0,
						y: 0,
						w: 'auto',
						h: 'auto'
				},
				useWKWebView:true,
				historyGestureEnabled:true,
				bounces:false,
				animation:{
							type:"push",
							subType:"from_right",
							duration:300
				},
				pageParam: pageParam
		});
	}
  rem(){
		// 适配方案
    if(window.innerWidth<1200){
			this.UIWidth = document.documentElement.clientWidth;
      this.UIHeight = document.documentElement.clientHeight;
      document.documentElement.style.fontSize = (0.01*this.UIWidth*3)+"px";
			document.querySelector("#app").style.height=this.UIHeight+"px"
    }
    window.onresize = ()=>{
      if(window.innerWidth<1200){
        this.UIWidth = document.documentElement.clientWidth;
        this.UIHeight = document.documentElement.clientHeight;
        document.documentElement.style.fontSize = (0.01*this.UIWidth*3)+"px";
      }
    }
  }
	stop_music(){
		this.print("停止")
		document.body.removeChild(this.audio);
	}
  play_music(src){
    this.audio = document.createElement("audio");
    this.source = document.createElement("source");
    this.source.type = "audio/mp3";
    this.audio.autoplay = "autoplay";
    this.source.src=src;
    this.audio.appendChild(this.source);
    document.body.appendChild(this.audio);
    var t = setInterval(()=>{
      if(this.audio.readyState > 0){
        if(this.audio.ended){
          clearInterval(t);
					try {
						document.body.removeChild(this.audio);
					} catch (e) {
						this.print(e);
					}
        }
      }
    },100);
  }
	openWin(name,url,pageParam){
		// 打开窗口
		api.openWin({
		    name: name,            // 自定义窗口名称
		    bounces: false,        // 窗口是否上下拉动
		    reload: true,          // 如果页面已经在之前被打开了,是否要重新加载当前窗口中的页面
		    url: url,              // 窗口创建时展示的html页面的本地路径[相对于当前代码所在文件的路径]
		    animation:{            // 打开新建窗口时的过渡动画效果
		    	type: "push",                //动画类型（详见动画类型常量）
		    	subType: "from_right",       //动画子类型（详见动画子类型常量）
		    	duration:300                //动画过渡时间，默认300毫秒
		    },
		    pageParam: pageParam   // 传递给下一个窗口使用的参数.将来可以在新窗口中通过 api.pageParam.name 获取
		});
	}
	closeWin(name){
		// 关闭窗口
		var params = name;
		if(name){
			params = {
					name: name
			}
		}
		api.closeWin(params);
	}
	openFrame(name,url,pageParam=null,rect=null){
			// 打开帧页面
			if(rect === null){
					rect = {
						// 方式1,设置矩形大小宽高
						x: 0,             // 左上角x轴坐标
						y: 0,             // 左上角y轴坐标
						w: 'auto',        // 当前帧页面的宽度, auto表示满屏
						h: 'auto'         // 当前帧页面的高度, auto表示满屏
					}
			}

			api.openFrame({
			    name: name,        // 帧页面的名称
			    url: url,          // 帧页面打开的url地址
			    bounces:false,     // 页面是否可以下拉拖动
			    reload: true,      // 帧页面如果已经存在,是否重新刷新加载
			    useWKWebView: true,
			    historyGestureEnabled:true,
			    animation:{
			        type:"push",             //动画类型（详见动画类型常量）
			    		subType:"from_right",    //动画子类型（详见动画子类型常量）
			    		duration:300             //动画过渡时间，默认300毫秒
			    },
			    rect: rect,                  // 当前帧的宽高范围
			    pageParam: pageParam,        // 要传递新建帧页面的参数,在新页面可通过 api.pageParam.name 获取
			});
		}
		closeFrame(name){
			// 关闭帧
			var params = name;
			if(name){
				params = {
						name: name
				}
			}
			api.closeFrame(params);
		}
		setfs(data){
			// 保存数据到本地文件系统中
			for(let key in data){
				api.setPrefs({ // 储存
				     key: key,
				     value: data[key]
				});
			}
		}
		getfs(key){ // keys="access_token"    keys = ["access_token","refresh_token"]
			// 根据key值来获取本地文件系统中存储的数据
			let keys = key;
			if(!(key instanceof Array)){ // 如果不是数组，改造成数组，统一操作
				keys = [key];
			}

			let data = {}
			for(let item of keys){
				data[item] = api.getPrefs({
						key: item,
						sync: true,
				});
			}

			if(key instanceof Array){
				return data;
			}

			return data[key];
		}
		delfs(key){
			// 根据key值来删除本地文件系统中存储的数据
			let keys = key;
			if(!(key instanceof Array)){ // 如果不是数组，改造成数组，统一操作
				keys = [key];
			}

			for(let item of keys){
				api.removePrefs({
				    key: item
				});
			}
		}
		setdata(data){
			// 保存数据到内存中
			for(let key in data){
				api.setGlobalData({ // 储存
						 key: key,
						 value: data[key]
				});
			}
		}
		getdata(key){
			// 根据key值来获取内存中存储的数据
			let keys = key;
			if(!(key instanceof Array)){ // 如果不是数组，改造成数组，统一操作
				keys = [key];
			}

			let data = {}
			for(let item of keys){
				data[item] = api.getGlobalData({
						key: item
				});
			}

			if(key instanceof Array){
				return data;
			}

			return data[key];
		}
		deldata(key){
			// 根据key值来删除内存中保存的数据
			// 因为本身并没有提供删除内存数据的方法，所以此处我们把设置为null即可
			let keys = key;
			if(!(key instanceof Array)){ // 如果不是数组，改造成数组，统一操作
				keys = [key];
			}
			for(let item of keys){
				api.setGlobalData({
						key: null
				});
			}
		}
		b64encode(data){
			// base64编码
			return window.btoa(data);
		}
		b64decode(data){
			// base64解码
			return window.atob(data);
		}
}
